home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / kowin / archive / kob / kob001s.lzh / xbmath.has < prev    next >
Text File  |  1996-09-02  |  38KB  |  2,340 lines

  1.  
  2. *━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  3. *
  4. *    xbmath.has  ……   ぺけ-BASICの数式評価(コンパイラ)
  5. *
  6. *━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  7.  
  8.     .xref    ko_debug
  9.     .xref    ko_dec_print
  10.     .xref    ko_hex_print
  11.  
  12.  
  13.     .include    fefunc.h
  14.     .include    variable.h
  15.  
  16.     .xref    hash
  17.     .xref    first_check_a5_in_line
  18.     .xref    error
  19.     .xref    errors
  20.  
  21.  
  22.     .text
  23.     .even
  24.  
  25.  
  26.  * 他の変数名と重なってないかどうか
  27.  *         d4.l = * (hash.w)(文字数-1)
  28.  *         a2.l = 元の対象の開始アドレス
  29.     .xdef    variable_check
  30. variable_check:
  31.  * 重なってない        d2.l    = -1
  32.  * int の n 番と一致    d2.l    = n+0000    ( n < システム変数 )
  33.  * str の n 番と一致    d2.l    = n+0100    ( n < システム変数 )
  34.  * char の n 番と一致    d2.l    = n+0200
  35.  * float の n 番と一致    d2.l    = n+8000
  36.  * d2.l < 0 = 代入出来ない(当たりがない or system 変数)
  37.  * d0 =   0 : 普通の変数
  38.  *      1 : 配列    ( a0 = その配列情報のポインタ )
  39.  *    $80 : auto 変数
  40.  *    $81 : auto 配列    ( a0 = その配列情報のポインタ )
  41.  *     -1 : 当たりなし
  42.  
  43.     lea.l    system変数,a3
  44.     moveq    #SYSVARNUM-1,d2        * system変数の個数
  45. sysvar_check_loop:
  46.     cmp.l    (a3),d4
  47.     addq.l    #8,a3
  48. scl0:
  49.     dbeq    d2,sysvar_check_loop
  50.     bne    scl1
  51.  
  52.     movea.l    -8+4(a3),a0
  53.     movea.l    a2,a1
  54.     move.w    d4,d1
  55. @@:
  56.     cmp.b    (a1)+,(a0)+
  57.     dbne    d1,@b
  58.     bne    scl0
  59.  
  60.      * 当たり
  61.         subq.w    #4,d2        * str 型の system変数番号
  62.         bcc    int_sys_var
  63.         cmpi.w    #-4,d2        * 'inkey$'
  64.         bne    1f
  65.  
  66.         cmpi.b    #'(',(a5)
  67.         bne    @f
  68.         addq.l    #1,a5
  69.         bsr    first_check_a5_in_line
  70.         cmpi.b    #'0',(a5)+
  71.         bne    式err
  72.         bsr    first_check_a5_in_line
  73.         cmpi.b    #')',(a5)+
  74.         bne    式err
  75.         subq.w    #1,d2        * 'inkey$(0)' = -5
  76. @@:
  77. 1:
  78.         swap    d2
  79.         move.w    #$0100,d2    * str
  80.         bra    vc_end
  81.  
  82. int_sys_var:
  83.         subi.w    #SYSVARNUM-4,d2        * int 型の system変数番号
  84.         swap    d2
  85.         clr.w    d2        * int
  86.         bra    vc_end
  87.  
  88.  
  89.  
  90. scl1:
  91.     tst.b    d7
  92.     bpl    global_var_check
  93.  
  94.     moveq    #8,d3        * 1項目辺りのサイズ(普通の変数用)
  95.  
  96.     lea.l    AUTOint,a3
  97.     bsr    _check
  98.     bge    vcA_end
  99.     lea.l    AUTOstr,a3
  100.     bsr    _check
  101.     bmi    @f
  102.     move.w    #$0100,d2
  103.     bra    vcA_end
  104. @@:
  105.     lea.l    AUTOfloat,a3
  106.     bsr    _check
  107.     bmi    @f
  108.     move.w    #$8000,d2
  109.     bra    vcA_end
  110. @@:
  111.     lea.l    AUTOchar,a3
  112.     bsr    _check
  113.     bmi    @f
  114.     move.w    #$0200,d2
  115. vcA_end:
  116.     move.w    #$0080,d0        * auto 変数
  117.     rts
  118.  
  119. @@:
  120.     moveq    #$20,d3        * 1項目辺りのサイズ(配列用)
  121.  
  122.     tst.b    d7
  123.     bpl    global_var_check
  124.     lea.l    AUTO配列,a3
  125.     bsr    _check
  126.     bmi    global_var_check
  127.     move.w    8(a0),d2    * 型
  128. *    move.w    12(a0),d1    * 添え字の最大数(1次元目)
  129.     move.w    #$0081,d0    * auto 配列
  130.     rts
  131.  
  132.  
  133.  
  134. global_var_check:
  135.     moveq    #8,d3        * 1項目辺りのサイズ(普通の変数用)
  136.  
  137.     lea.l    変数int,a3
  138.     bsr    _check
  139.     bge    vc_end
  140.     lea.l    変数str,a3
  141.     bsr    _check
  142.     bmi    @f
  143.     move.w    #$0100,d2
  144.     bra    vc_end
  145. @@:
  146.     lea.l    変数float,a3
  147.     bsr    _check
  148.     bmi    @f
  149.     move.w    #$8000,d2
  150.     bra    vc_end
  151. @@:
  152.     lea.l    変数char,a3
  153.     bsr    _check
  154.     bmi    global_dim_check
  155.     move.w    #$0200,d2
  156. vc_end:
  157.     moveq    #0,d0        * 普通の変数
  158.     rts
  159.  
  160.  
  161. global_dim_check:
  162.     moveq    #$20,d3        * 1項目辺りのサイズ(配列用)
  163.  
  164.     lea.l    配列,a3
  165.     bsr    _check
  166.     bmi    変数当たりなし
  167.     move.w    8(a0),d2    * 型
  168. *    move.w    12(a0),d1    * 添え字の最大数
  169.     moveq    #1,d0        * 配列
  170.     rts
  171.  
  172.  
  173. 変数当たりなし:
  174.     moveq    #-1,d0        * 当たりなし
  175.     rts
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  * d3 = 1項目辺りのサイズ(普通の変数 = 8 , 配列 = $20 )
  186. _check:
  187.  * d2.upper.w = 当たった変数番号 ( -1 = 当たりなし )
  188.     movea.l    (a3)+,a0
  189.     move.w    (a3),d2        * 登録されている変数の個数 - 1
  190.     bmi    _check_path
  191.  
  192.     move.w    d2,d0
  193.     moveq    #変数個数,d5
  194. _check_loop:
  195.     cmp.l    (a0),d4        * (hash.w)(文字数-1)
  196.     bne    c_next
  197.     movea.l    4(a0),a3
  198.     movea.l    a2,a1
  199.     move.w    d4,d1
  200. @@:
  201.     cmp.b    (a1)+,(a3)+
  202.     dbne    d1,@b
  203.     beq    _check_合致
  204. c_next:
  205.     adda.w    d3,a0
  206.     subq.w    #1,d5
  207.     dbeq    d0,_check_loop
  208.     bne    _check_path
  209.     moveq    #変数個数,d5
  210.     movea.l    (a0),a0        * 次の鎖
  211.     dbra    d0,_check_loop
  212. _check_path:
  213.     moveq    #-1,d2
  214.     rts
  215.  
  216. _check_合致:
  217.     sub.w    d0,d2
  218.     swap    d2
  219.     clr.w    d2
  220.     rts
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.     .xdef    sysfunc_check
  228. sysfunc_check:
  229.     movem.l    d1/d2/d4/a0-a3,-(sp)
  230.     movem.l    4+4*7(sp),d4/a2        * hash/name
  231.  
  232.     lea.l    system関数,a3
  233.     moveq    #SYSFUNCNUM-1,d2        * system関数の個数
  234. sysfunc_check_loop:
  235.     cmp.l    (a3),d4
  236.     addq.l    #8,a3
  237. sf0:
  238.     dbeq    d2,sysfunc_check_loop
  239.     bne    sf1                * 該当無し
  240.  
  241.     movea.l    -8+4(a3),a0            * address
  242.     movea.l    a2,a1
  243.     move.w    d4,d1                * 長さ-1
  244. @@:
  245.     cmp.b    (a1)+,(a0)+
  246.     dbne    d1,@b
  247.     bne    sf0                * 外れ
  248.  
  249.  * 当たりゆえ登録
  250.     lea.l    システム関数対応option(pc),a0
  251.     add.w    d2,d2
  252.     move.w    (a0,d2.w),d2
  253.     *    KH    ' システム関数番号*4 = ',d2
  254.     lea.l    system関数登録,a0
  255.     move.l    a4,(a0,d2.w)            * プログラムアドレス登録!
  256.  
  257. sf1:
  258.     movem.l    (sp)+,d1/d2/d4/a0-a3
  259.     rts
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  *         d4.l = * (hash.w)(文字数-1)
  266.  *         a2.l = 元の対象の開始アドレス
  267.     .xdef    function_check
  268. function_check:
  269.  * d0.w = ヒットした関数の返り値の型    ( = 0 : 該当関数無し )
  270.  *    = $8000  float
  271.  *    = $8001  int
  272.  *    = $8002  char    新設
  273.  *    = $8003  str
  274.  *    = $ffff  void
  275.  * d0.w < 0 の時
  276.  *    d1.w = 引き数の個数
  277.  *    d3.w = 0 から始まる関数番号    ( < 0 : 内部関数 )
  278.  *    a2   = パラメーターテーブル
  279.  
  280.     move.w    内部関数個数,d5
  281.     bmi    @f
  282.     movea.l    内部関数buf,a3
  283.     bsr    fncchk_loop
  284. *    tst.w    d0
  285.     beq    @f
  286.     move.w    d5,d3
  287.     sub.w    内部関数個数,d3        * 内部関数番号 (<0)
  288.     subq.w    #1,d3
  289.     rts
  290. @@:
  291.     lea.l    外部functable,a0
  292.     move.l    d4,d0
  293.     swap    d0
  294.     clr.w    d3
  295.     move.b    d0,d3
  296.     lsl.w    #2,d3
  297.     add.w    d3,a0
  298.     move.w    (a0)+,d3    * 関数buf からのオフセット
  299.     move.w    (a0)+,d5    * 個数
  300.     bmi    fnc無し
  301.     movea.l    関数buf,a3
  302.     adda.w    d3,a3
  303.     lsr.w    #4,d3
  304.     add.w    d5,d3
  305.     bsr    fncchk_loop
  306.     sub.w    d5,d3            * 関数番号(あれば)
  307.     rts
  308.  
  309.  
  310. **    **
  311. fncchk_loop:
  312.     cmp.l    (a3),d4
  313.     lea.l    $10(a3),a3
  314. fncchk_loop0:
  315.     dbeq    d5,fncchk_loop
  316.     bne    fnc無し
  317.     move.l    a2,a0
  318.     move.l    -$10+4(a3),a1    * 関数名
  319.     move.w    d4,d0
  320. @@:
  321.     cmp.b    (a0)+,(a1)+
  322.     dbne    d0,@b
  323.     bne    fncchk_loop0
  324.  
  325.  * 当たり!
  326.     movea.l    -$10+8(a3),a2    * パラメーターテーブル
  327.     movea.l    a2,a0
  328.     moveq    #-1,d1
  329. @@:
  330.     addq.w    #1,d1
  331.     move.w    (a0)+,d0
  332.     bge    @b        * 関数の返り値(負の値)
  333.     cmpi.w    #$8080,d0    * 配列拡張
  334.     bne    1f
  335.         moveq    #$f,d0
  336.         and.w    (a0)+,d0    * (型+) 次元 - 1
  337.         add.w    d0,d0
  338.         lea.l    2+2(a0,d0.w),a0    * 添字指定フラグと次元だけの添字の大きさ飛ばす
  339.         bra    @b
  340.  
  341. 1:
  342. *    subq.w    #1,d1        * 引き数の個数
  343.     rts
  344.  
  345.  
  346. fnc無し:
  347.     moveq    #0,d0
  348.     rts
  349.  
  350.  
  351.  
  352.  
  353. **    **    **    **    **    **    **    **
  354.  
  355.  
  356.  
  357.     .xdef    system関数table作成
  358. system関数table作成:
  359.     lea.l    system関数登録,a4
  360.     moveq    #EVENTNUM-1,d6        * system関数の個数
  361. @@:
  362.     clr.l    (a4)+                * 登録エリアを NULL で埋める
  363.     dbra    d6,@b
  364.  
  365.     lea.l    system関数,a4
  366.     moveq    #SYSFUNCNUM-1,d6        * system関数の個数
  367.     lea.l    システム関数(pc),a5
  368.     bra    sysvar_loop
  369.  
  370.  
  371.     .xdef    system変数table作成
  372. system変数table作成:
  373.     lea.l    system変数,a4
  374.     moveq    #SYSVARNUM-1,d6        * system変数の個数
  375.     lea.l    システム変数(pc),a5
  376. sysvar_loop:
  377.     bsr    hash
  378.  * a2.l = 元の対象の開始アドレス
  379.  * d5.w = ハッシュ値だ。上位バイトもそのままだ
  380.  * d4.l = (hash.w)(文字数 - 1)
  381.  * d1.b = お次の文字 ( $00 )
  382.  
  383.     move.l    d4,(a4)+    * (hash.w)(文字数 - 1)
  384.     move.l    a2,(a4)+    * 名前
  385.  
  386.     addq.l    #1,a5
  387.  
  388.     dbra    d6,sysvar_loop
  389.     rts
  390.  
  391.  
  392.         * システム関数追加の際は、ここにイベント番号を加え、
  393.         * 下の「システム関数」の名前のところに逆順にして名前を足す
  394. システム関数対応option:
  395.     .dc.w    0*4    * open
  396.     .dc.w    1*4    * redraw
  397.     .dc.w    2*4    * close
  398.     .dc.w    5*4    * move
  399.     .dc.w    6*4    * resize
  400.     .dc.w    7*4    * iconify
  401.     .dc.w    10*4    * mouse_switch
  402.     .dc.w    11*4    * mouse_move
  403.     .dc.w    12*4    * mouse_enter
  404.     .dc.w    13*4    * mouse_out
  405.     .dc.w    14*4    * key
  406.     .dc.w    15*4    * interval
  407.     .dc.w    17*4    * user
  408.  
  409. システム関数:
  410.     .dc.b    'Euser',0        *12
  411.     .dc.b    'Einterval',0        *11
  412.     .dc.b    'Ekey',0        *10
  413.     .dc.b    'Emouse_out',0        *9
  414.     .dc.b    'Emouse_enter',0    *8
  415.     .dc.b    'Emouse_move',0        *7
  416.     .dc.b    'Emouse',0        *6
  417.     .dc.b    'Eiconify',0        *5
  418.     .dc.b    'Eresize',0        *4
  419.     .dc.b    'Emove',0        *3
  420.     .dc.b    'Eclose',0        *2
  421.     .dc.b    'Eredraw',0        *1
  422.     .dc.b    'Eopen',0        *0
  423.     .dc.b    0
  424.  
  425. システム変数:
  426.     .dc.b    'csrlin',0    * int -1
  427.     .dc.b    'errno',0    * int -2
  428.     .dc.b    'free',0    * int -3
  429.     .dc.b    'pos',0     * int -4
  430.     .dc.b    'WINX',0    * -5
  431.     .dc.b    'WINY',0
  432.     .dc.b    'WINH',0
  433.     .dc.b    'WINV',0
  434.     .dc.b    'ITIME',0    * -9
  435.     .dc.b    'info_x',0    * -10
  436.     .dc.b    'info_y',0
  437.     .dc.b    'info_h',0
  438.     .dc.b    'info_v',0
  439.     .dc.b    'info_Rstat',0    * -14
  440.     .dc.b    'info_Lstat',0
  441.     .dc.b    'info_Lon',0
  442.     .dc.b    'info_Loff',0
  443.     .dc.b    'info_Ron',0
  444.     .dc.b    'info_Roff',0
  445.     .dc.b    'info_MoveFlag',0    * -20
  446.     .dc.b    'info_KeyCode',0
  447.     .dc.b    'info_ShiftStat',0
  448.     .dc.b    'info_Counter',0
  449.     .dc.b    'info_ComData',0
  450.     .dc.b    'info_Buffer',0
  451.  
  452.     .dc.b    'date$',0    * str -1(3)
  453.     .dc.b    'day$',0    * str -2
  454.     .dc.b    'time$',0    * str -3
  455.     .dc.b    'inkey$',0    * str -4(0)
  456.     .dc.b    0
  457.     .even
  458.  
  459. **    **    **    **    **    **    **    **
  460.  
  461.  
  462.  
  463.  
  464.  
  465.  
  466.  
  467.  
  468.  
  469.  
  470.  
  471.  
  472.  
  473.  
  474.  
  475.  
  476.  
  477.  
  478.  
  479.  * 演算子チェック
  480.  * 演算子だったら    d0.w = 演算子番号+優先順位
  481.  * 違ったら        d0.w = 0
  482.  * プログラム終了なら    d0.w = -1
  483.     .xdef    cal_check
  484. cal_check:
  485.  * まず、空白(9,32)を飛ばして、先頭の文字を見る。
  486.     bsr    first_check_a5_in_line
  487.  * 数字なら            d0 = 0
  488.  * 行の終わりなら        d0 = -1
  489.  * その他なら            d0 = そのキャラクタ
  490.     tst.w    d0
  491.     ble    cal_check_end0
  492.     cmpi.b    #'/',d0            * 注釈
  493.     bne    @f
  494.     cmpi.b    #'*',1(a5)
  495.     beq    cal_check_end000        * 注釈なら演算子ではない
  496. @@:
  497.  
  498.     lea.l    _m1(pc),a0
  499.     moveq    #8-1,d1
  500. @@:
  501.     cmp.b    (a0)+,d0
  502.     dbeq    d1,@b
  503.     bne    no_simple_cal
  504.     add.w    d1,d1
  505.     move.w    _moji1(pc,d1.w),d0
  506.     cmpi.w    #6*2,d1
  507.     bcs    cal_check_end
  508.     beq    smaller
  509.     cmpi.b    #'=',1(a5)
  510.     bne    cal_check_end
  511.     move.w    #$0e0a,d0        * '>='
  512.     addq.l    #2,a5
  513.     rts
  514. smaller:
  515.     cmpi.b    #'>',1(a5)
  516.     beq    not_equal
  517.     cmpi.b    #'=',1(a5)
  518.     bne    cal_check_end
  519.     move.w    #$0d0a,d0        * '<='
  520.     addq.l    #2,a5
  521.     rts
  522. not_equal:
  523.     move.w    #$0a0a,d0        * '<>'
  524.     addq.l    #2,a5
  525.     rts
  526. cal_check_end:
  527.     addq.l    #1,a5
  528. cal_check_end0:
  529.     rts
  530. cal_check_end000:
  531.     moveq    #0,d0
  532.     rts
  533. _moji1:
  534.     .dc.w    $0101        * '*'
  535.     .dc.w    $0201        * '/'
  536.     .dc.w    $0302        * '\'
  537.     .dc.w    $0504        * '+'
  538.     .dc.w    $0604        * '-'
  539.     .dc.w    $090a        * '='
  540.     .dc.w    $0b0a        * '<'
  541.     .dc.w    $0c0a        * '>'
  542. _m1:
  543.     .dc.b    '><=-+\/*'
  544.     *     76543210
  545.  
  546.  
  547.  
  548.  
  549. no_simple_cal:
  550.     lea.l    _cp_cal(pc),a1
  551.     lea.l    _cp_calS(pc),a2
  552.     moveq    #7-1,d1
  553. @@:
  554.     bsr    one_check
  555.     beq    @f
  556.     addq.l    #2,a1
  557.     dbra    d1,@b
  558.     moveq    #0,d0
  559.     rts
  560.  
  561. @@:
  562.     move.w    (a1),d0
  563.     rts
  564.  
  565.  
  566. _cp_cal:
  567.     .dc.w    $1112        * 'or'
  568.     .dc.w    $1011        * 'and'
  569.     .dc.w    $0403        * 'mod'
  570.     .dc.w    $0f10        * 'not'
  571.     .dc.w    $0806        * 'shl'
  572.     .dc.w    $0706        * 'shr'
  573.     .dc.w    $1213        * 'xor'
  574. _cp_calS:
  575.     .dc.b    'or',0
  576.     .dc.b    'and',0
  577.     .dc.b    'mod',0
  578.     .dc.b    'not',0
  579.     .dc.b    'shl',0
  580.     .dc.b    'shr',0
  581.     .dc.b    'xor',0
  582.     .even
  583.  
  584.  
  585.  
  586.  * (a2) と a5 からの文字列を見比べる。
  587.  * 一致してかつ、後ろが英数字以外    zero
  588.  * 不一致                non zero
  589.  * a0,d0 : 破壊
  590.  * a2    : $00 の後ろ(次の文字列)
  591.     .xdef    one_check
  592. one_check:
  593.     movea.l    a5,a0
  594. @@:
  595.     move.b    (a2)+,d0
  596.     beq    oc_ok
  597.     cmp.b    (a0)+,d0
  598.     beq    @b
  599. @@:
  600.     tst.b    (a2)+        * 次へ
  601.     bne    @b
  602. oc_out:
  603.     moveq    #-1,d0
  604.     rts
  605.  
  606. oc_ok:
  607.     move.b    (a0),d0
  608.  
  609.     cmpi.b    #'$',d0
  610.     beq    oc_out
  611.     cmpi.b    #'0',d0
  612.     bcs    @f
  613.     cmpi.b    #'9',d0
  614.     bls    oc_out
  615.     cmpi.b    #'A',d0
  616.     bcs    @f
  617.     cmpi.b    #'Z',d0
  618.     bls    oc_out
  619.     cmpi.b    #'_',d0
  620.     beq    oc_out
  621.     cmpi.b    #'a',d0
  622.     bcs    @f
  623.     cmpi.b    #'z',d0
  624.     bls    oc_out
  625. @@:
  626.     movea.l    a0,a5
  627.     moveq    #0,d0
  628.     rts
  629.  
  630.  
  631.  
  632.  
  633.  
  634.  
  635.  
  636.  
  637.     .xdef    int定数get
  638. int定数get:
  639.     movem.l    d1-d6/a1-a3,-(sp)
  640.     lea.l    tmp,a3
  641.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  642.  * int        d2.w    = 0000
  643.     moveq    #0,d2
  644.     bsr    math解釈    * math解釈の最適化を利用
  645.  *    return  d6.w    = 変数の型
  646.     lea.l    tmp,a3
  647.     cmpi.w    #$80_00,(a3)+
  648.     bne    式err
  649.     move.l    (a3)+,d0
  650.     movem.l    (sp)+,d1-d6/a1-a3
  651.     rts
  652.  
  653.  
  654.  
  655.  
  656.  
  657.  
  658.  
  659.  
  660.  
  661. INT    equ    $0000
  662. STR    equ    $0100
  663. CHAR    equ    $0200
  664. FLOAT    equ    $8000
  665. 不明    equ    $ffff
  666.  
  667.  
  668.  
  669.  
  670.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  671.  * int        d2.w    = 0000
  672.  * str        d2.w    = 0100
  673.  * char     d2.w    = 0200
  674.  * float    d2.w    = 8000
  675.  * 型未判明    d2.w    = ffff
  676.     .xdef    math解釈
  677. math解釈:
  678.  *    return  d6.w    = 変数の型
  679.  *    今のところ一応 'math解釈' の内部では tmp は使わないことになっている
  680.  * a4 : 保存
  681.     move.l    a4,-(sp)        * 全然アドレスレジスタが足りない
  682.     lea.l    -$400(sp),sp    * 1 KB のワーク
  683.     movea.l    sp,a4
  684.     move.l    a3,$c(a4)        * 書き込み先
  685.     movea.l    a4,a0
  686.     movea.l    a4,a1
  687.     lea.l    $10(a0),a0
  688.     move.l    a0,(a1)+        * 式を並べるポインタ
  689.     lea.l    $100-$10(a0),a0
  690.     move.l    a0,(a1)+        * 項のアドレスを並べるポインタ
  691.     lea.l    $200-$100(a0),a0
  692.     move.l    a0,(a1)+        * 項を並べるポインタ
  693.  
  694.     move.l    d2,-(sp)    * 最後に型チェック
  695.  
  696.  
  697.  
  698.  
  699.  * 式を解釈して (a3) から書き込む
  700. 解釈:
  701.  
  702.  * 演算子チェック    not と - は特別に先頭に有っても良いので
  703.     bsr    cal_check
  704.  * 演算子だったら    d0.w = 演算子番号+優先順位
  705.  * 違ったら        d0.w = 0
  706.  * プログラム終了なら    d0.w = -1
  707.     tst.w    d0
  708.     bmi    式err
  709.     beq    解釈loop
  710.     cmpi.w    #$0504,d0        * '+' は 無視
  711.     beq    解釈loop
  712.     cmpi.w    #$0f10,d0        * 'not'
  713.     beq    Not
  714.     cmpi.w    #$0604,d0        * '-'
  715.     bne    式err        * 式の先頭に -,not 以外は使えません
  716.     move.w    #$1300,d0        * minus(特別)
  717.  
  718. Not:
  719.     movea.l    (a4),a0
  720.     move.w    d0,(a0)+    * 式(演算子)
  721.     move.l    a0,(a4)
  722.  
  723.  
  724.  
  725. 解釈loop:
  726.  * まず、空白(9,32)を飛ばして、先頭の文字を見る。
  727.     bsr    first_check_a5_in_line
  728.  * 数字なら            d0 = 0
  729.  * 行の終わりなら        d0 = -1
  730.  * その他なら            d0 = そのキャラクタ
  731.  
  732.     tst.w    d0
  733.     beq    数字
  734.     bmi    式err
  735.     cmpi.b    #'.',d0
  736.     beq    数字
  737.     cmpi.b    #'&',d0
  738.     beq    型付き数字
  739.     cmpi.b    #'"',d0
  740.     beq    str定数
  741.     cmpi.b    #$27,d0        * 「 ' 」
  742.     beq    一文字定数
  743.  
  744.  
  745.  
  746.  * 括弧がついてるかどうか調べなければ
  747.     cmpi.b    #'(',d0
  748.     bne    括弧無し
  749.  
  750.     addq.l    #1,a5
  751.     move.l    8(a4),a3
  752.     moveq    #-1,d2
  753.     bsr    math解釈            ****  再帰  ****
  754.  
  755.     movem.l    (a4),a0-a2
  756.         * a1 = 項のアドレスを並べるポインタ
  757.         * a2 = 項を並べるポインタ
  758.     clr.w    (a0)+            * 式
  759.     move.l    a2,(a1)+
  760.     adda.l    d0,a2        * 項
  761.     lsr.l    #1,d0
  762.     move.l    d0,(a1)+    * 長さ
  763.     movem.l    a0-a2,(a4)
  764.  
  765.     cmpi.b    #')',(a5)+        * 括弧がちゃんと終わっているか?
  766.     beq    演算子チェック
  767.     bra    式err
  768.  
  769.  
  770.  
  771.  
  772.  
  773.  
  774.  
  775.  
  776. 括弧無し:
  777.  
  778.  * ハッシュ値を計算しながら、文字数を数える
  779.     bsr    hash
  780.  * a2.l = 元の対象の開始アドレス
  781.  * d5.w = ハッシュ値だ。上位バイトもそのままだ
  782.  * d4.w = 文字数 - 1
  783.  * d1.b = お次の文字 (  (,[,=,:, , etc... )
  784.     tst.w    d4
  785.     blt    式err
  786.  
  787.  
  788.  
  789.  
  790.  
  791.  
  792.  * 関数かどうかチェック
  793.     cmpi.b    #'(',d1
  794.     bne    変数かどうかチェック
  795.  
  796.  
  797.  *        d4.l = * (hash.w)(文字数-1)
  798.  *         a2.l = 元の対象の開始アドレス
  799.     bsr    function_check
  800.  * d0.w = ヒットした関数の返り値の型    ( = 0 : 該当関数無し )
  801.  *    = $8000  float
  802.  *    = $8001  int
  803.  *    = $8003  str
  804.  *    = $ffff  void
  805.  * d0.w < 0 の時
  806.  *    d1.w = 引き数の個数
  807.  *    d3.w = 0 から始まる関数番号    ( < 0 : 内部関数になる予定 )
  808.  *    a2   = パラメーターテーブル
  809.     tst.w    d0
  810.     beq    変数かどうかチェック
  811.  
  812.  
  813.     tst.b    d0
  814.     bmi    void呼出
  815.     beq    float呼出
  816.     subq.b    #1,d0
  817.     beq    int呼出
  818.     subq.b    #1,d0
  819.     beq    char呼出
  820. *str呼出:
  821.     move.w    #$c001,d2
  822.     bra    @f
  823. float呼出:
  824.     move.w    #$c080,d2
  825.     bra    @f
  826. char呼出:
  827.     move.w    #$c002,d2
  828.     bra    @f
  829. int呼出:
  830.     move.w    #$c000,d2        * int 関数を示す
  831. @@:
  832.  
  833.  
  834.  * 関数の処理
  835.     movem.l    (a4),a0-a1/a3
  836.         * a1 = 項のアドレスを並べるポインタ
  837.         * a3 = 項を並べるポインタ
  838.     clr.w    (a0)+            * 式
  839.     move.l    a3,(a1)+
  840.  
  841.     move.w    d2,(a3)+        * 関数印+型
  842.  * 関数の解釈
  843.  * input    a2   = パラメーターテーブル
  844.  *        a3   = 書き込み先アドレス
  845.  *        d1.w = 引き数の個数
  846.  *        d3.w = 0 から始まる関数番号    ( < 0 : 内部関数になる予定 )
  847.     movem.l    d4-d6/a0-a1/a4,-(sp)
  848.     bsr    function解釈
  849.     movem.l    (sp)+,d4-d6/a0-a1/a4
  850.  *        d0   = 書き込んだ長さ
  851.  
  852.  
  853.     addq.l    #2,d0
  854.     lsr.l    #1,d0            * ワード単位
  855.     move.l    d0,(a1)+
  856.  
  857.     movem.l    a0-a1/a3,(a4)
  858.     bra    演算子チェック
  859.  
  860. void呼出:
  861.     ERRORS    21
  862.  
  863.  
  864.  
  865.  
  866.  
  867.  
  868.  
  869.  
  870. 変数かどうかチェック:
  871.  * 変数かどうかチェック
  872.  *        d4.l = * (hash.w)(文字数-1)
  873.  *         a2.l = 元の対象の開始アドレス
  874.     bsr    variable_check
  875.  * 重なってない        d2.l    = -1
  876.  * int の n 番と一致    d2.l    = n+0000    ( n < システム変数 )
  877.  * str の n 番と一致    d2.l    = n+0100    ( n < システム変数 )
  878.  * char の n 番と一致    d2.l    = n+0200
  879.  * float の n 番と一致    d2.l    = n+8000
  880.  * d2.l < 0 = 代入出来ない(当たりがない or system 変数)
  881.  * d0 =   0 : 普通の変数
  882.  *      1 : 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  883.  *    $80 : auto 変数
  884.  *    $81 : auto 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  885.  *     -1 : 当たりなし
  886.     bmi    misengen_var
  887.  
  888.     cmpi.w    #$0100,d2
  889.     bne    @f
  890.     cmpi.b    #'[',(a5)
  891.     beq    文字列ポインタ
  892. @@:
  893.  
  894.  
  895.  
  896.     btst    #0,d0
  897.     beq    普通の変数参照
  898.  
  899.  * 配列の場合
  900.     move.l    (a4),a1
  901.     clr.w    (a1)+            * 式
  902.     move.l    a1,(a4)
  903.     movem.l    4(a4),a1-a2
  904.         * a1 = 項のアドレスを並べるポインタ
  905.         * a2 = 項を並べるポインタ
  906.     move.l    a2,(a1)+
  907.  
  908. * a0 = その配列情報
  909.     addq.l    #8,a0
  910.     move.w    (a0)+,d2    * 型    ($0000,$0100,$0200,$8000)
  911.  
  912.     move.b    #$60,d2        * 配列を示す
  913.     tst.b    d0
  914.     bpl    @f
  915.     addq.b    #1,d2
  916. @@:
  917.     ror.w    #8,d2
  918.     swap    d2
  919.     move.l    d2,(a2)+    * [配列の印 + 型] + 配列番号
  920. *    move.w    d1,(a2)+    * 
  921.  
  922.     move.w    (a0)+,d2    * 次元 - 1
  923.  
  924.  
  925.     cmpi.b    #'(',(a5)
  926.     bne    式err
  927.  
  928.     moveq    #0,d0        * 添え字情報の長さ
  929. @@:
  930.     addq.l    #1,a5
  931.  
  932.     movea.l    a2,a3
  933.     movem.l    d0/d2/d6/a0-a1,-(sp)
  934.     moveq    #0,d2        * int
  935.     bsr    math解釈            ****  再帰  ****
  936.     add.l    (sp)+,d0
  937.     movem.l    (sp)+,d2/d6/a0-a1
  938.     movea.l    a3,a2            * 項
  939.  
  940.     cmpi.b    #',',(a5)
  941.     dbne    d2,@b
  942.     beq    添え字の個数が多い
  943.     tst.w    d2
  944.     bne    添え字の個数が少ない
  945.  
  946.     cmpi.b    #')',(a5)+        * 括弧がちゃんと終わっているか?
  947.     bne    式err
  948.  
  949.  
  950.     lsr.l    #1,d0
  951.     addq.l    #4/2,d0
  952.     move.l    d0,(a1)+    * 長さ
  953.  
  954.  
  955.     movem.l    a1-a2,4(a4)
  956.     bra    演算子チェック
  957.  
  958. 添え字の個数が少ない:
  959.     ERROR    56
  960. 添え字の個数が多い:
  961.     ERROR    57
  962.  
  963.  
  964.  
  965.  
  966. 普通の変数参照:
  967.     movem.l    (a4),a0-a2
  968.     clr.w    (a0)+            * 式
  969.         * a1 = 項のアドレスを並べるポインタ
  970.         * a2 = 項を並べるポインタ
  971.     move.l    a2,(a1)+
  972.  
  973.     move.b    #$40,d2        * 変数を示す
  974.     tst.b    d0
  975.     bpl    @f
  976.     addq.b    #1,d2
  977. @@:
  978.     ror.w    #8,d2
  979.     swap    d2
  980.     move.l    d2,(a2)+
  981.     moveq    #4/2,d0
  982.     move.l    d0,(a1)+
  983.     movem.l    a0-a2,(a4)
  984.     bra    演算子チェック
  985.  
  986.  
  987.  
  988.  
  989.  
  990. 文字列ポインタ:
  991.     addq.l    #1,a5
  992.  
  993.     btst    #0,d0
  994.     bne    式err        * 配列だって?
  995.     tst.l    d2
  996.     bmi    式err        * system変数?
  997.  
  998.     move.w    #$0200,d2    * char
  999.  * 型(d6) <- 型(d2) の代入が整合しているかどうか
  1000. *    bsr    型check
  1001.  
  1002.     move.w    #$5002,d2
  1003.     tst.b    d0
  1004.     bge    @f
  1005.     move.w    #$5102,d2
  1006. @@:
  1007.  
  1008.     movem.l    (a4),a0-a2
  1009.         * a1 = 項のアドレスを並べるポインタ
  1010.         * a2 = 項を並べるポインタ
  1011.     clr.w    (a0)+            * 式
  1012.     move.l    a2,(a1)+
  1013.  
  1014.     move.w    d2,(a2)+    * 文字列変数ポインタ
  1015.     swap    d2
  1016.     move.w    d2,-(sp)
  1017.  
  1018.     movea.l    a2,a3
  1019.     movem.l    a0-a1,-(sp)
  1020.     moveq    #0,d2        * int
  1021.     bsr    math解釈            ****  再帰  ****
  1022.     movem.l    (sp)+,a0-a1
  1023.     movea.l    a3,a2
  1024.  
  1025.     move.w    (sp)+,(a2)+    * 変数番号
  1026.  
  1027.     cmpi.b    #']',(a5)+        * 括弧がちゃんと終わっているか?
  1028.     bne    式err
  1029.  
  1030.     lsr.l    #1,d0
  1031.     addq.l    #4/2,d0
  1032.     move.l    d0,(a1)+    * 長さ
  1033.  
  1034.     movem.l    a0-a2,(a4)
  1035.     bra    演算子チェック
  1036.  
  1037.  
  1038.  
  1039.  
  1040.  
  1041.  
  1042.  
  1043.  
  1044. str定数:
  1045.     movem.l    (a4),a0-a2
  1046.         * a1 = 項のアドレスを並べるポインタ
  1047.         * a2 = 項を並べるポインタ
  1048.     clr.w    (a0)+    * 式
  1049.  
  1050.     move.l    a2,(a1)+
  1051.     move.w    #$8001,(a2)+    * 文字列定数を示す
  1052.  
  1053.  * (a5)"~" を (a2) に書き移す
  1054.     bsr    str_copy
  1055.  * a2 = 次の偶数アドレス
  1056.  * d0 = データの長さ / 2
  1057.  
  1058.     addq.l    #1,d0
  1059.     move.l    d0,(a1)+    * 項の長さ
  1060.  
  1061.     movem.l    a0-a2,(a4)
  1062.  
  1063.     bra    演算子チェック
  1064.  
  1065.  
  1066.  
  1067.  
  1068.  
  1069.  
  1070.  
  1071. 一文字定数:
  1072.     addq.l    #1,a5
  1073.     moveq.l    #0,d0
  1074.     move.b    (a5)+,d0
  1075.     cmpi.b    #$27,(a5)+    * 「 ' 」
  1076.     bne    式err
  1077.  
  1078.     moveq    #INT,d2
  1079.     movem.l    (a4),a0-a2
  1080.         * a1 = 項のアドレスを並べるポインタ
  1081.         * a2 = 項を並べるポインタ
  1082.     clr.w    (a0)+    * 式
  1083.  
  1084.     move.l    a2,(a1)+
  1085.     moveq    #6/2,d1
  1086.     move.l    d1,(a1)+    * 項の長さ
  1087.  
  1088.     move.w    #$8000,(a2)+        * 定数を示す
  1089.     move.l    d0,(a2)+    * int
  1090.  
  1091.     movem.l    a0-a2,(a4)
  1092.  
  1093.     bra    演算子チェック
  1094.  
  1095.  
  1096.  
  1097.  
  1098.  
  1099.  
  1100.  
  1101.  
  1102.  
  1103.  
  1104.  
  1105.  
  1106. 型付き数字:
  1107.     moveq    #INT,d2
  1108.     bra    @f
  1109.  
  1110. 数字:
  1111.     bsr    Imm判断     * d2 = 小数点があれば float 型、でなければ int 型
  1112. @@:
  1113.     bsr    定数get
  1114.  
  1115.     movem.l    (a4),a0-a2
  1116.         * a1 = 項のアドレスを並べるポインタ
  1117.         * a2 = 項を並べるポインタ
  1118.     clr.w    (a0)+    * 式
  1119.  
  1120.     move.l    a2,(a1)+
  1121.  
  1122.     move.w    d2,d3
  1123.     move.b    #$80,d3        * 定数を示す
  1124.     ror.w    #8,d3
  1125.     move.w    d3,(a2)+
  1126.  
  1127.     cmpi.w    #FLOAT,d2
  1128.     beq    __float
  1129.  
  1130. *    FPACK    __DTOL        * (符号)(絶対値の整数化)を取るやつ
  1131.     move.l    d0,(a2)+    * int
  1132.     moveq    #6/2,d0
  1133.     bra    @f
  1134.  
  1135. __float
  1136.     move.l    d0,(a2)+    * float の上位ロングワード
  1137.     move.l    d1,(a2)+    * float の下位ロングワード
  1138.     moveq    #10/2,d0
  1139.     cmpi.b    #'#',(a5)
  1140.     bne    @f
  1141.     addq.l    #1,a5
  1142. @@:
  1143.     move.l    d0,(a1)+    * 項の長さ
  1144.  
  1145.     movem.l    a0-a2,(a4)
  1146.  
  1147. ***    bra    演算子チェック    *
  1148.  
  1149.  
  1150.  
  1151.  
  1152.  
  1153.  
  1154.  
  1155.  
  1156.  
  1157.  
  1158. 演算子チェック:
  1159.  
  1160.  * 演算子チェック
  1161.     bsr    cal_check
  1162.  * 演算子だったら    d0.w = 演算子番号+優先順位
  1163.  * 違ったら        d0.w = 0
  1164.  * プログラム終了なら    d0.w = -1
  1165.     tst.w    d0
  1166.     ble    並べ替え        * 数式コード化終了
  1167.     cmpi.w    #$0f10,d0        * 'not'
  1168.     beq    式err
  1169.  
  1170.     movea.l    (a4),a0
  1171.     move.w    d0,(a0)+    * siki
  1172.     move.l    a0,(a4)
  1173.     bra    解釈
  1174.  
  1175.  
  1176.  
  1177.  
  1178.  
  1179.  
  1180.  
  1181.  
  1182.  
  1183.  
  1184. **    **    **
  1185.  
  1186.  
  1187. 並べ替え:
  1188.     movea.l    (a4),a1
  1189.     move.l    a1,d4
  1190.     sub.l    a4,d4
  1191.     lsr.w    #1,d4
  1192.     subi.w    #9,d4
  1193.     move.w    d4,-(sp)    * 保存 (式要素数-1)
  1194.     subq.w    #1,d4
  1195.     bcs    展開
  1196.  
  1197. 並べ替えloop:
  1198.     move.w    -(a1),d2
  1199.     ble    並べ替えcont
  1200.     cmpi.w    #$0f10,d2        * 'not'
  1201.     beq    並べ替えcont
  1202.     cmpi.w    #$1300,d2        * minus
  1203.     beq    並べ替えcont
  1204.  
  1205.     movea.l    a1,a0
  1206.     move.w    d4,d3
  1207. 移動loop:
  1208.     move.w    -(a0),d1
  1209.     beq    @f        * 項は無条件でずれる
  1210.     bmi    移動終了    * 移動後のものは抜かさない
  1211.     cmp.b    d2,d1        * 優先順位比較
  1212.     bhi    移動終了
  1213. @@:
  1214.     move.w    d1,2(a0)
  1215.  
  1216.     dbra    d3,移動loop
  1217.     subq.l    #2,a0
  1218. 移動終了:
  1219.     bset    #15,d2        * もう動かない
  1220.     move.w    d2,2(a0)
  1221. 並べ替えcont:
  1222.     dbra    d4,並べ替えloop
  1223.  
  1224.  
  1225.  
  1226.  
  1227.  
  1228.  
  1229.  
  1230. 展開:
  1231.     move.w    (sp)+,d5
  1232.     lea.l    $100(a4),a1
  1233.     lea.l    $10(a4),a2
  1234.     move.l    $c(a4),a3
  1235.  
  1236.     bsr    最適化                *
  1237.     lsl.w    #8,d0
  1238.     move.l    (sp)+,d6
  1239.     cmpi.w    #$ffff,d6
  1240.     bne    @f
  1241.     move.w    d0,d6
  1242.     bra    1f
  1243. @@:
  1244.     cmp.w    d0,d6
  1245.     beq    1f
  1246.     cmpi.w    #STR,d0
  1247.     beq    型違い
  1248.     cmpi.w    #STR,d6
  1249.     beq    型違い
  1250. 1:
  1251.  
  1252.     moveq    #0,d0
  1253. 展開loop:
  1254.     move.w    (a2)+,d1
  1255.     cmpi.w    #$100,d1
  1256.     bcc    演算子だ
  1257.  
  1258.     lsl.w    #3,d1
  1259.     movea.l    (a1,d1.w),a0        * その項の内容のアドレス
  1260.     move.l    4(a1,d1.w),d1        * その項の長さ (単位・ワード)
  1261.     add.w    d1,d0
  1262.     subq.w    #1,d1
  1263. @@:
  1264.     move.w    (a0)+,(a3)+
  1265.     dbra    d1,@b
  1266.     bra    展開cont
  1267.  
  1268.  
  1269. 演算子だ:
  1270.     clr.w    d2
  1271.     move.b    d1,d2
  1272.     move.w    d2,(a3)+    * 演算子だ+型
  1273.     lsr.w    #8,d1
  1274.     add.w    d1,d1
  1275.     move.w    d1,(a3)+    * 演算子番号 * 2
  1276.     addq.w    #2,d0        * 長さ (単位・ワード)
  1277. 展開cont:
  1278.     dbra    d5,展開loop
  1279.     add.w    d0,d0        * 長さ (単位・バイト)
  1280.     lea.l    $400(sp),sp
  1281.     move.l    (sp)+,a4
  1282.     rts
  1283.  
  1284.  
  1285. misengen_var:
  1286.     ERRORS    7
  1287. 式err:
  1288.     ERROR    9
  1289.  
  1290.  
  1291.  
  1292.  
  1293.  
  1294.  
  1295.  
  1296.  
  1297.  
  1298.  
  1299.  
  1300. 最適化:
  1301.     movem.l    d2/d4/a1-a3,-(sp)
  1302.     moveq    #0,d0
  1303.     move.w    d5,d4        * 項の数
  1304. sai1:
  1305.     tst.w    (a2)+
  1306.     bne    @f
  1307.     move.w    d0,-2(a2)        * 「値」に番号づけ
  1308.     addq.w    #1,d0
  1309. @@:
  1310.     dbra    d4,sai1
  1311.  
  1312.  
  1313.     .xdef    break5
  1314. break5:
  1315.  
  1316.     move.w    d5,d4        * 項の数
  1317. 最適化loop:
  1318.     move.w    -(a2),d6    * 後ろから読んでいく(演算子「後づけ」状態)
  1319.     cmpi.w    #$100,d6
  1320.     bcc    最適化_演算子
  1321.  
  1322. 最適化_値:
  1323.     move.w    d6,d1
  1324.     lsl.w    #3,d1
  1325.     movea.l    (a1,d1.w),a0        * その項の内容のアドレス
  1326.  
  1327.     cmpi.b    #$80,(a0)+
  1328.     beq    1f
  1329.     moveq    #-1,d6        * 定数でない
  1330.     bra    @f
  1331. 1:
  1332.     lsl.w    #8,d6
  1333. @@:
  1334.     move.b    (a0),d6
  1335.     move.w    d6,-(sp)    * スタックに積む    (値番号(<0:定数でない)、型)
  1336.     bra    最適化cont
  1337.  
  1338.  
  1339.  
  1340.  
  1341. 最適化_演算子:
  1342.     bclr    #15,d6        * 移動済み印がついてるかも
  1343.     move.w    d6,d2
  1344.     lsr.w    #8,d2    * 演算子番号
  1345.     cmpi.w    #$0f,d2        * not
  1346.     beq    一項演算子
  1347.     cmpi.w    #$13,d2        * minus
  1348.     beq    一項演算子
  1349. 二項演算子:
  1350.     move.w    (sp)+,d0    * 前
  1351.     move.w    (sp),d1        * 後
  1352.     cmpi.b    #1,d0        * STR
  1353.     bne    @f
  1354.     cmpi.b    #1,d1        * STR
  1355.     beq    二項STR
  1356.     bra    型違い
  1357. @@:
  1358.  
  1359.     move.b    d0,d3
  1360.     cmp.b    d1,d0
  1361.     beq    1f        * 型一致
  1362.     cmpi.b    #1,d1        * STR
  1363.     beq    型違い
  1364.     tst.b    d0    * float
  1365.     bmi    1f
  1366.     tst.b    d1    * float
  1367.     bmi    2f
  1368.     clr.b    d0
  1369.     clr.b    d3
  1370.     bra    1f
  1371. 2:
  1372.     move.b    d1,d3
  1373. 1:
  1374.     move.b    d3,d6        * 型
  1375.     move.b    d3,1(sp)
  1376.  
  1377.     cmpi.w    #3,d2        * \
  1378.     beq    3f
  1379.     cmpi.w    #4,d2        * mod
  1380.     beq    3f
  1381.     cmpi.w    #7,d2
  1382.     bcs    @f
  1383. 3:
  1384.     clr.b    d6        * int型専用の演算子
  1385.     move.w    #$ff00,(sp)    * (定数でない、int 型)
  1386. *    clr.w    1(sp)
  1387. @@:
  1388.     move.w    d6,(a2)        * 型登録
  1389. *    bra    最適化cont
  1390.  
  1391.     tst.w    d1
  1392.     bmi    @f
  1393.     tst.w    d0
  1394.     bmi    後ろは定数である
  1395.  
  1396.  * 両方とも定数
  1397.     tst.b    d0
  1398.     bmi    二項定数float
  1399.     tst.b    d1
  1400.     bmi    二項定数float
  1401.     bra    二項定数int
  1402.  
  1403. @@:
  1404.     tst.w    d0
  1405.     bmi    両方は定数でない
  1406. 前は定数である:
  1407.     tst.b    d0
  1408.     bmi    両方は定数でない
  1409.     tst.b    d1
  1410.     bmi    両方は定数でない
  1411.  * とりあえず両方 int の時のみ
  1412.     move.w    d0,d1
  1413.     cmpi.w    #1,d2        * *
  1414.     beq    掛け算片方
  1415.     cmpi.w    #5,d2        * +
  1416.     beq    足し算片方
  1417.     bra    両方は定数でない
  1418.  
  1419.  
  1420. 後ろは定数である:
  1421.     tst.b    d0
  1422.     bmi    両方は定数でない
  1423.     tst.b    d1
  1424.     bmi    両方は定数でない
  1425.  * とりあえず両方 int の時のみ
  1426.  
  1427.     subq.w    #8,d2
  1428.     bhi    両方は定数でない
  1429.     add.w    d2,d2
  1430.     move.w    _s(pc,d2.w),d2
  1431.     jmp    _s(pc,d2.w)
  1432.     .dc.w    両方は定数でない-_s
  1433.     .dc.w    掛け算片方-_s
  1434.     .dc.w    割り算片方-_s
  1435.     .dc.w    割り算片方-_s
  1436.     .dc.w    両方は定数でない-_s
  1437.     .dc.w    足し算片方-_s
  1438.     .dc.w    引き算片方-_s
  1439.     .dc.w    SHR片方-_s
  1440. _s:    .dc.w    SHL片方-_s
  1441. SHL片方:
  1442.     lsr.w    #8,d1
  1443.     move.w    d1,d0        * #
  1444.     lsl.w    #3,d0
  1445.     movea.l    (a1,d0.w),a0
  1446.     move.l    2(a0),d0        * 第二項
  1447.     beq    両方は定数でない
  1448.     subq.l    #8,d0
  1449.     bhi    両方は定数でない
  1450.  
  1451.     add.w    d0,d0
  1452.     move.w    _shl(pc,d0.w),d0
  1453.     bra    9f
  1454.     .dc.w    $30    *2
  1455.     .dc.w    $32    *4
  1456.     .dc.w    $36    *8
  1457.     .dc.w    $3e    *16
  1458.     .dc.w    $40    *32
  1459.     .dc.w    $41
  1460.     .dc.w    $42
  1461. _shl:    .dc.w    $43
  1462.  
  1463.  
  1464. SHR片方:
  1465.     lsr.w    #8,d1
  1466.     move.w    d1,d0        * #
  1467.     lsl.w    #3,d0
  1468.     movea.l    (a1,d0.w),a0
  1469.     move.l    2(a0),d0        * 第二項
  1470.     beq    両方は定数でない
  1471.     subq.l    #8,d0
  1472.     bhi    両方は定数でない
  1473.  
  1474.     add.w    #$50-1+8,d0        * $50~$57
  1475.     bra    9f
  1476.  
  1477.  
  1478. 引き算片方:
  1479.     lsr.w    #8,d1
  1480.     move.w    d1,d0        * #
  1481.     lsl.w    #3,d0
  1482.     movea.l    (a1,d0.w),a0
  1483.     move.l    2(a0),d0        * 第二項
  1484.     beq    両方は定数でない    * あとで
  1485.     subq.l    #8,d0
  1486.     bhi    両方は定数でない
  1487.  
  1488.     add.w    #$28-1+8,d0        * $28~$2f
  1489.     bra    9f
  1490.  
  1491.  
  1492. 割り算片方:
  1493.     lsr.w    #8,d1
  1494.     move.w    d1,d0        * #
  1495.     lsl.w    #3,d0
  1496.     movea.l    (a1,d0.w),a0
  1497.     move.l    2(a0),d0        * 第二項
  1498.     lsr.l    #1,d0            * H8/2/1 thanks for 村重さん
  1499.     bcs    両方は定数でない
  1500.     beq    式err            * 0で割れんよ
  1501.  
  1502.     moveq    #$48,d2
  1503.     .rept    7
  1504.     lsr.w    #1,d0
  1505.     bcs    @f
  1506.     addq.w    #1,d2
  1507.     .endm
  1508.     lsr.w    #1,d0
  1509.     bcc    両方は定数でない
  1510. @@:
  1511.     tst.l    d0
  1512.     bne    両方は定数でない
  1513.     move.w    d2,d0
  1514.     bra    9f
  1515.  
  1516.  
  1517.  
  1518.  
  1519. 掛け算片方:
  1520.     lsr.w    #8,d1
  1521.     move.w    d1,d0        * #
  1522.     lsl.w    #3,d0
  1523.     movea.l    (a1,d0.w),a0
  1524.     move.l    2(a0),d0        * 第二項
  1525.     subq.l    #2,d0
  1526.     bcs    両方は定数でない    * 0,1 は無視
  1527.     cmpi.l    #16-2,d0
  1528.     bhi    @f
  1529.     add.w    #$30,d0            * $30~$3e
  1530.     bra    9f
  1531.  
  1532.  
  1533. @@:
  1534.     cmpi.l    #32-2,d0
  1535.     beq    mul32
  1536.     cmpi.l    #64-2,d0
  1537.     beq    mul64
  1538.     cmpi.l    #128-2,d0
  1539.     beq    mul128
  1540.     cmpi.l    #256-2,d0
  1541.     beq    mul256
  1542.     bra    両方は定数でない
  1543. mul32:
  1544.     move.w    #$40,d0
  1545.     bra    9f
  1546. mul64:
  1547.     move.w    #$41,d0
  1548.     bra    9f
  1549. mul128:
  1550.     move.w    #$42,d0
  1551.     bra    9f
  1552. mul256:
  1553.     move.w    #$43,d0
  1554.     bra    9f
  1555.  
  1556. 足し算片方:
  1557.     lsr.w    #8,d1
  1558.     move.w    d1,d0        * #
  1559.     lsl.w    #3,d0
  1560.     movea.l    (a1,d0.w),a0
  1561.     move.l    2(a0),d0        * 第二項
  1562.     beq    両方は定数でない    * あとで
  1563.     subq.l    #8,d0
  1564.     bhi    両方は定数でない
  1565.  
  1566.     add.w    #$1f+8,d0        * $20~$27
  1567. 9:
  1568.     lsl.w    #8,d0
  1569.     move.w    d0,(a2)        * 'addq.l d0,??' の演算子(int)
  1570.     move.w    #$ff00,(sp)    * (定数でない、int 型)
  1571.  
  1572.     subq.w    #1,d5
  1573.     move.w    d5,d0
  1574.     sub.w    d4,d0
  1575.     movea.l    a2,a0
  1576. @@:
  1577.     cmp.w    (a0)+,d1
  1578.     dbeq    d0,@b
  1579.     bne    最適化cont
  1580.     subq.l    #2,a0
  1581. @@:
  1582.     move.w    2(a0),(a0)+
  1583.     dbra    d0,@b
  1584.     bra    最適化cont
  1585.  
  1586.  
  1587.  
  1588.  
  1589.  
  1590. 二項定数float演算しない:
  1591.     move.w    #$ff80,(sp)    * (定数でない、float 型)
  1592.     bra    最適化cont
  1593. 二項定数float:
  1594.     cmpi.w    #3,d2        * \
  1595.     beq    二項定数float演算しない
  1596.     cmpi.w    #4,d2        * mod
  1597.     beq    二項定数float演算しない
  1598.     cmpi.w    #7,d2        * sh? 関係・論理
  1599.     bcc    二項定数float演算しない
  1600.     tst.b    d0
  1601.     bge    @f
  1602.     move.w    d0,(sp)        * float登録
  1603.         * (d0 がfloat でないなら、すでに登録されているd1がfloat)
  1604. @@:
  1605.  
  1606.     movem.w    d0/d2,-(sp)
  1607.  
  1608.     lsr.w    #8,d1
  1609.     bcc    第二項int
  1610.     lsl.w    #3,d1
  1611.     movea.l    (a1,d1.w),a0
  1612.     movem.l    2(a0),d2-d3        * 第二項
  1613.     bra    @f
  1614. 第二項int:
  1615.     lsl.w    #3,d1
  1616.     movea.l    (a1,d1.w),a0
  1617.     move.l    2(a0),d0        * 第二項
  1618.     FPACK    __LTOD
  1619.     move.l    d0,d2
  1620.     move.l    d1,d3
  1621. @@:
  1622.     move.w    (sp)+,d0
  1623.  
  1624.     lsr.w    #8,d0
  1625.     bcc    第一項int
  1626.     lsl.w    #3,d0
  1627.     movea.l    (a1,d0.w),a0
  1628.     movem.l    2(a0),d0-d1        * 第一項
  1629.     bra    @f
  1630. 第一項int:
  1631.     lsl.w    #3,d0
  1632.     movea.l    (a1,d0.w),a0
  1633.     move.l    2(a0),d0        * 第一項
  1634.     FPACK    __LTOD
  1635. @@:
  1636.  
  1637.     move.w    (sp)+,d6
  1638.     add.w    d6,d6        * 演算子番号
  1639.     move.w    saf(pc,d6.w),d6
  1640.     jmp    saf(pc,d6.w)
  1641. saf:
  1642.     .dc.w    0    * dummy
  1643.     .dc.w    Sfmul-saf
  1644.     .dc.w    Sfdiv-saf
  1645.     .dc.w    0
  1646.     .dc.w    0
  1647.     .dc.w    Sfadd-saf
  1648.     .dc.w    Sfsub-saf
  1649. Sfmul:
  1650.     FPACK    __DMUL
  1651.     bra    @f
  1652. Sfdiv:
  1653.     FPACK    __DDIV
  1654.     bra    @f
  1655. Sfadd:
  1656.     FPACK    __DADD
  1657.     bra    @f
  1658. Sfsub:
  1659.     FPACK    __DSUB
  1660. @@:
  1661.     move.w    (sp),d2
  1662.     lsr.w    #8,d2
  1663.     move.w    d2,4(a2)        * だんだんよくわからなくなってきた。
  1664.     lsl.w    #3,d2
  1665.     movea.l    (a1,d2.w),a0
  1666.     movem.l    d0-d1,2(a0)
  1667.     bra    2ずらしf
  1668.  
  1669.  
  1670.  
  1671.  * 両方ともint定数
  1672. 二項定数int:
  1673.     lsr.w    #8,d0
  1674.     lsl.w    #3,d0
  1675.     movea.l    (a1,d0.w),a0
  1676.     addq.l    #2,a0
  1677.     move.l    (a0),d0        * 第一項
  1678.  
  1679.     lsr.w    #8,d1
  1680.     lsl.w    #3,d1
  1681.     movea.l    (a1,d1.w),a0
  1682.     addq.l    #2,a0
  1683.     move.l    (a0),d1        * 第二項
  1684.  
  1685.     add.w    d2,d2        * 演算子番号
  1686.     move.w    sai(pc,d2.w),d2
  1687.     jmp    sai(pc,d2.w)
  1688. sai:
  1689.     .dc.w    0    * dummy
  1690.     .dc.w    Smul-sai
  1691.     .dc.w    Sdiv-sai
  1692.     .dc.w    Sdiv2-sai
  1693.     .dc.w    Smod-sai
  1694.     .dc.w    Sadd-sai
  1695.     .dc.w    Ssub-sai
  1696.     .dc.w    Sshr-sai
  1697.     .dc.w    Sshl-sai
  1698.     .dc.w    Sequal-sai
  1699.     .dc.w    Snoteq-sai
  1700.     .dc.w    Ssmall-sai
  1701.     .dc.w    Slarge-sai
  1702.     .dc.w    Seq_small-sai
  1703.     .dc.w    Seq_large-sai
  1704.     .dc.w    0    * Snot-sai
  1705.     .dc.w    Sand-sai
  1706.     .dc.w    Sor-sai
  1707.     .dc.w    Sxor-sai
  1708. *    .dc.w    Sminus-sai
  1709.  
  1710.  
  1711.  
  1712. Smul:
  1713.     FPACK    __LMUL
  1714.     bra    2ずらし
  1715. Sdiv:
  1716. Sdiv2:
  1717.     FPACK    __LDIV
  1718.     bra    2ずらし
  1719. Smod:
  1720.     FPACK    __LMOD
  1721.     bra    2ずらし
  1722. Sadd:
  1723.     add.l    d1,d0
  1724.     bra    2ずらし
  1725. Ssub:
  1726.     sub.l    d1,d0
  1727.     bra    2ずらし
  1728. Sshr:
  1729.     lsr.l    d1,d0
  1730.     bra    2ずらし
  1731. Sshl:
  1732.     lsl.l    d1,d0
  1733.     bra    2ずらし
  1734. Sequal:
  1735.     cmp.l    d1,d0
  1736.     beq    Strue
  1737.     bra    Sfault
  1738. Snoteq:
  1739.     cmp.l    d1,d0
  1740.     bne    Strue
  1741.     bra    Sfault
  1742. Ssmall:
  1743.     cmp.l    d1,d0
  1744.     blt    Strue
  1745.     bra    Sfault
  1746. Slarge:
  1747.     cmp.l    d1,d0
  1748.     bgt    Strue
  1749.     bra    Sfault
  1750. Seq_small:
  1751.     cmp.l    d1,d0
  1752.     ble    Strue
  1753.     bra    Sfault
  1754. Seq_large:
  1755.     cmp.l    d1,d0
  1756.     bge    Strue
  1757.     bra    Sfault
  1758. Sfault:
  1759.     moveq    #0,d0
  1760.     bra    2ずらし
  1761. Strue:
  1762.     moveq    #-1,d0
  1763.     bra    2ずらし
  1764.  
  1765. Sand:
  1766.     and.l    d1,d0
  1767.     bra    2ずらし
  1768. Sor:
  1769.     or.l    d1,d0
  1770.     bra    2ずらし
  1771. Sxor:
  1772.     eor.l    d1,d0
  1773. *    bra    2ずらし
  1774.  
  1775. 2ずらし:
  1776.     move.l    d0,(a0)        * 後ろの項に化ける
  1777. 2ずらしf:
  1778.     subq.w    #2,d5
  1779.     move.w    d5,d0
  1780.     sub.w    d4,d0
  1781.     movea.l    a2,a0
  1782. @@:
  1783.     move.w    4(a0),(a0)+
  1784.     dbra    d0,@b
  1785.     bra    最適化cont
  1786.  
  1787.  
  1788. 両方は定数でない:
  1789.     move.b    #$ff,(sp)    * 定数でない
  1790.     bra    最適化cont
  1791.  
  1792.  
  1793.  
  1794.  
  1795.  
  1796. 二項STR:
  1797.     move.b    d0,d6        * 型
  1798.     cmpi.w    #5,d2    * '+' 
  1799.     bne    二項STR2
  1800.     move.w    d6,(a2)        * 登録
  1801.     bra    最適化cont
  1802. 二項STR2:
  1803.     cmpi.w    #9,d2
  1804.     bcs    型違い
  1805.     cmpi.w    #$0f,d2
  1806.     bcc    型違い
  1807.     clr.b    d6        * int型
  1808.     move.w    d6,(a2)        * 登録
  1809.     move.w    #$ff00,(sp)    * (定数でない、int 型)
  1810.     bra    最適化cont
  1811.  
  1812.  
  1813.  
  1814.  
  1815. 一項演算子:
  1816.     move.w    (sp),d0        * スタックから取り出す
  1817.     cmpi.b    #1,d0        * STR
  1818.     beq    型違い
  1819.     tst.b    d0
  1820.     bmi    @f    * float
  1821.     tst.w    d0
  1822.     bge    一項定数
  1823. @@:
  1824.     cmpi.w    #$0f,d2        * not
  1825.     beq    一項not
  1826. 一項minus:
  1827.     move.b    d0,d6        * 型
  1828.     move.w    d6,(a2)        * 登録
  1829.     bra    最適化cont
  1830. 一項not:
  1831.     clr.b    d6        * int 型
  1832.     move.w    d6,(a2)        * 登録
  1833.     bra    最適化cont
  1834.  
  1835. 一項定数:
  1836.     lsr.w    #8,d0        * 値番号
  1837.     lsl.w    #3,d0
  1838.     movea.l    (a1,d0.w),a0        * その項の内容のアドレス
  1839.     addq.l    #2,a0
  1840.     move.l    (a0),d0
  1841.     cmpi.w    #$0f,d2        * not
  1842.     bne    @f
  1843.     not.l    d0
  1844.     bra    1ずらし
  1845. @@:
  1846.     neg.l    d0
  1847.  
  1848. 1ずらし:
  1849.     move.l    d0,(a0)        * 後ろの項に化ける
  1850.     subq.w    #1,d5
  1851.     move.w    d5,d0
  1852.     sub.w    d4,d0
  1853.     movea.l    a2,a0
  1854. @@:
  1855.     move.w    2(a0),(a0)+
  1856.     dbra    d0,@b
  1857. *    bra    最適化cont
  1858.  
  1859.  
  1860. 最適化cont:
  1861.     dbra    d4,最適化loop
  1862.     move.w    (sp)+,d0    * スタックから出す
  1863. *最適化しない:
  1864.     movem.l    (sp)+,d2/d4/a1-a3
  1865.     rts
  1866.  
  1867.  
  1868.  
  1869.  
  1870.  
  1871.  
  1872.  
  1873.  
  1874.  
  1875.  
  1876. 定数get:
  1877.     cmpi.w    #FLOAT,d2
  1878.     beq    定数float
  1879.     cmpi.b    #'&',(a5)
  1880.     beq    定数etc
  1881.     movea.l    a5,a0
  1882.     FPACK    __STOL
  1883.     movea.l    a0,a5
  1884.     rts
  1885.  
  1886. 定数etc:
  1887.     lea.l    1(a5),a0
  1888.     moveq    #$20,d0
  1889.     or.b    (a0)+,d0
  1890.     cmpi.b    #'h',d0
  1891.     beq    定数HEX
  1892.     cmpi.b    #'b',d0
  1893.     beq    定数BIN
  1894.     cmpi.b    #'o',d0
  1895.     beq    定数OCT
  1896.     bra    式err
  1897.  
  1898. 定数BIN:
  1899.     FPACK    __STOB
  1900.     movea.l    a0,a5
  1901.     rts
  1902.  
  1903. 定数OCT:
  1904.     FPACK    __STOO
  1905.     movea.l    a0,a5
  1906.     rts
  1907.  
  1908. 定数HEX:
  1909.     FPACK    __STOH
  1910.     movea.l    a0,a5
  1911.     rts
  1912.  
  1913. 定数float:
  1914.     move.w    d2,-(sp)
  1915.     movea.l    a5,a0
  1916.     FPACK    __VAL        * 数値変換
  1917.     movea.l    a0,a5
  1918.     move.w    (sp)+,d2
  1919.     rts
  1920.  
  1921.  
  1922.  
  1923.  
  1924.  
  1925.  
  1926.  
  1927.  
  1928. Imm判断:    * (a5) 小数点 or '#' があれば float 型、でなければ int 型
  1929.     movea.l    a5,a0
  1930. im_loop:
  1931.     move.b    (a0)+,d2
  1932.     beq    int判定
  1933.     cmpi.b    #'.',d2
  1934.     beq    float判定
  1935.     cmpi.b    #'#',d2
  1936.     beq    float判定
  1937.     cmpi.b    #'9',d2
  1938.     bhi    int判定
  1939.     cmpi.b    #'0',d2
  1940.     bcc    im_loop
  1941. int判定:
  1942.     moveq    #INT,d2
  1943.     rts
  1944. float判定:
  1945.     move.w    #FLOAT,d2
  1946.     rts
  1947.  
  1948.  
  1949.  
  1950.  
  1951.  
  1952.  
  1953.  
  1954.  
  1955.  
  1956.  
  1957.  * (a5)"~" を (a2) に書き移す
  1958. str_copy:
  1959.  * a2 = 次の偶数アドレス
  1960.  * d0 = データの長さ / 2
  1961.  
  1962.     addq.l    #1,a5        * '"'
  1963.     moveq    #0+1,d0        * 最後の $00 の文
  1964. sc_loop:
  1965.     move.b    (a5)+,d1
  1966.     beq    sc_end
  1967.     cmpi.b    #'"',d1
  1968.     bhi    sc_ok
  1969.     beq    sc_end0
  1970.     cmpi.b    #$d,d1
  1971.     beq    sc_end
  1972.     cmpi.b    #$a,d1
  1973.     beq    sc_end
  1974.  
  1975. sc_ok:
  1976.     move.b    d1,(a2)+
  1977.     addq.w    #1,d0
  1978.     bra    sc_loop
  1979.  
  1980. sc_end:
  1981.     subq.l    #1,a5        * $00,$0a,$0d
  1982. sc_end0:
  1983.     clr.b    (a2)+
  1984.  
  1985.     lsr.w    #1,d0
  1986.     bcc    @f
  1987.     addq.w    #1,d0
  1988.     clr.b    (a2)+    * even
  1989. @@:
  1990.     rts
  1991.  
  1992.  
  1993.  
  1994.  
  1995.  
  1996.  
  1997.  
  1998.  
  1999. **    **    **    **    **    **    **    **    **
  2000.  
  2001.  
  2002.  
  2003.  
  2004.  
  2005.  
  2006.  
  2007.  
  2008.  * 関数の解釈
  2009.  * input    a2   = パラメーターテーブル
  2010.  *        a3   = 書き込み先アドレス
  2011.  *        d1.w = 引き数の個数
  2012.  *        d3.w = 0 から始まる関数番号    ( < 0 : 内部関数になる予定 )
  2013.     .xdef    function解釈
  2014. function解釈:
  2015.  *        d0   = 書き込んだ長さ
  2016.  
  2017.  
  2018.     movem.l    d4-d6,-(sp)
  2019.  
  2020. *    move.w    d3,(a3)+    * d3.w = 0 から始まる関数番号
  2021.     move.w    d3,-(sp)    * d3.w = 0 から始まる関数番号
  2022.     move.w    d1,(a3)+    * d1.w = 引き数の個数
  2023.     moveq    #4,d1    * 書き込んだ長さ
  2024.  
  2025.  
  2026. fnc_loop:
  2027.     cmpi.b    #')',(a5)
  2028.     beq    @f
  2029.     addq.l    #1,a5        * '(' or ','
  2030. @@:
  2031.  
  2032.  * まず、空白(9,32)を飛ばして、先頭の文字を見る。
  2033.     bsr    first_check_a5_in_line
  2034.  * 数字なら            d0 = 0
  2035.  * 行の終わりなら        d0 = -1
  2036.  * その他なら            d0 = そのキャラクタ
  2037.  
  2038.     move.w    (a2)+,d2    * parameter get
  2039.     bge    @f
  2040.     cmpi.w    #$8080,d2    * 配列拡張
  2041.     beq    拡張配列の引き数
  2042.     bra    fnc_loop_end    * 返り値
  2043.  
  2044. @@:
  2045.     tst.b    d2
  2046.     bge    @f
  2047.  * 省略可能な引き数
  2048.     cmpi.b    #',',d0
  2049.     beq    引き数省略
  2050.     cmpi.b    #')',d0
  2051.     beq    引き数省略
  2052.  
  2053. @@:
  2054.     moveq    #$60,d0
  2055.     and.b    d2,d0
  2056.     bne    配列の引き数
  2057.  
  2058.     btst    #4,d2
  2059.     bne    ポインタの引き数
  2060.  
  2061.     btst    #0,d2
  2062.     bne    float引き数
  2063.     btst    #1,d2
  2064.     bne    int引き数
  2065.     btst    #2,d2
  2066.     bne    char引き数
  2067.     btst    #3,d2
  2068.     bne    str引き数
  2069.     ERROR    19
  2070.  
  2071. float引き数:
  2072.     move.w    #$8080,d2
  2073.     bra    @f
  2074. char引き数:
  2075.     move.w    #$8002,d2
  2076.     bra    @f
  2077. str引き数:
  2078.     move.w    #$8001,d2
  2079.     bra    @f
  2080. int引き数:
  2081.     move.w    #$8000,d2
  2082.  
  2083. @@:
  2084.     move.w    d2,(a3)+
  2085.     addq.w    #2,d1
  2086.     ror.w    #8,d2
  2087.     clr.b    d2
  2088.  
  2089.  
  2090.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  2091.  * int        d2.w    = 0000
  2092.  * str        d2.w    = 0100
  2093.  * char     d2.w    = 0200
  2094.  * float    d2.w    = 8000
  2095.  * 型未判明    d2.w    = ffff
  2096.     movem.l    d1/a2,-(sp)
  2097.     bsr    math解釈
  2098.     movem.l    (sp)+,d1/a2
  2099.  *    return  d6.w    = 変数の型
  2100.  
  2101.     add.l    d0,d1
  2102.  
  2103.     bra    fnc_loop
  2104.  
  2105.  
  2106. 引き数省略:
  2107.     move.w    #$00ff,(a3)+
  2108.     addq.w    #2,d1
  2109.     bra    fnc_loop
  2110.  
  2111.  
  2112.  * d0.b = $20    1次元配列
  2113.  * d0.b = $40    2次元配列
  2114. 配列の引き数:
  2115.     movem.l    d1/a2/a3,-(sp)
  2116.     movem.w    d0/d2,-(sp)
  2117.     bsr    hash
  2118.     tst.w    d4
  2119.     blt    hennahikisu
  2120.  *        d4.l = * (hash.w)(文字数-1)
  2121.  *         a2.l = 元の対象の開始アドレス
  2122.     bsr    variable_check
  2123.  * 重なってない        d2.l    = -1
  2124.  * int の n 番と一致    d2.l    = n+0000    ( n < システム変数 )
  2125.  * str の n 番と一致    d2.l    = n+0100    ( n < システム変数 )
  2126.  * char の n 番と一致    d2.l    = n+0200
  2127.  * float の n 番と一致    d2.l    = n+8000
  2128.  * d2.l < 0 = 代入出来ない(当たりがない or system 変数)
  2129.  * d0 =   0 : 普通の変数
  2130.  *      1 : 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  2131.  *    $80 : auto 変数
  2132.  *    $81 : auto 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  2133.  *     -1 : 当たりなし
  2134.     bmi    hennahikisu
  2135.     btst    #0,d0
  2136.     beq    hennahikisu
  2137.     move.b    d0,d3
  2138.  
  2139.     move.w    (sp)+,d0        * 要求している次元
  2140.  
  2141.     move.w    $a(a0),d1    * 指定された配列の次元
  2142.     beq    @f
  2143.     subq.w    #1,d1
  2144.     bne    hennahikisu        * 3次元以上の配列は駄目
  2145.     btst    #6,d0
  2146.     bne    fnc_1
  2147.     bra    hennahikisu
  2148. @@:
  2149.     btst    #5,d0
  2150.     beq    hennahikisu
  2151. fnc_1
  2152.  
  2153.     move.w    (sp)+,d0        * 引き数の型
  2154.     movem.l    (sp)+,d1/a2/a3
  2155.     bsr    引き数型check
  2156.  
  2157.     move.b    #$40,d2        * 配列の引き数
  2158.     tst.b    d3
  2159.     bpl    @f
  2160.     addq.b    #1,d2        * auto 配列の引き数
  2161. @@:
  2162.     ror.w    #8,d2
  2163.     swap    d2        * 下位=配列番号
  2164.     move.l    d2,(a3)+
  2165.     addq.w    #4,d1
  2166.     bra    fnc_loop
  2167.  
  2168.  
  2169. 拡張配列の引き数:
  2170.     movem.l    d1/a2/a3,-(sp)
  2171.     bsr    hash
  2172.     tst.w    d4
  2173.     blt    hennahikisu
  2174.  *        d4.l = * (hash.w)(文字数-1)
  2175.  *         a2.l = 元の対象の開始アドレス
  2176.     bsr    variable_check
  2177.  * 重なってない        d2.l    = -1
  2178.  * int の n 番と一致    d2.l    = n+0000    ( n < システム変数 )
  2179.  * str の n 番と一致    d2.l    = n+0100    ( n < システム変数 )
  2180.  * char の n 番と一致    d2.l    = n+0200
  2181.  * float の n 番と一致    d2.l    = n+8000
  2182.  * d2.l < 0 = 代入出来ない(当たりがない or system 変数)
  2183.  * d0 =   0 : 普通の変数
  2184.  *      1 : 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  2185.  *    $80 : auto 変数
  2186.  *    $81 : auto 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  2187.  *     -1 : 当たりなし
  2188.     bmi    hennahikisu    * 未宣言
  2189.     btst    #0,d0        * 配列
  2190.     beq    hennahikisu
  2191.     movem.l    (sp)+,d1/a2/a3
  2192.  
  2193.     move.w    (a2)+,d4    * 型+次元-1
  2194.     moveq    #$f,d3
  2195.     and.w    d4,d3        * 次元-1
  2196.     clr.b    d4        * 型
  2197.  
  2198.     cmp.w    d2,d4
  2199.     bne    hennahikisu    * 型が合わない
  2200.     cmp.w    $a(a0),d3
  2201.     bne    dim_jigen    * 次元が合わない
  2202.  
  2203.     move.b    #$40,d2        * 配列の引き数
  2204.     tst.b    d0
  2205.     bpl    @f
  2206.     addq.b    #1,d2        * auto 配列の引き数
  2207. @@:
  2208.     ror.w    #8,d2
  2209.     swap    d2        * 下位=配列番号
  2210.     move.l    d2,(a3)+
  2211.     addq.w    #4,d1
  2212.  
  2213.  
  2214.     move.w    (a2)+,d4    * 添字指定フラグ
  2215.     lea.l    12(a0),a0    * その配列の添字列
  2216. 1:
  2217.     add.w    d4,d4
  2218.     bcc    @f
  2219.     move.w    (a2),d0        * 添字指定の大きさ(あれば)
  2220.     cmp.w    (a0),d0
  2221.     bne    dim_soeji    * 添字が合わない
  2222. @@:
  2223.     addq.l    #2,a0
  2224.     addq.l    #2,a2
  2225.     dbra    d3,1b
  2226.  
  2227.     bra    fnc_loop
  2228.  
  2229.  
  2230.  
  2231.  
  2232. ポインタの引き数:
  2233.  * ということは、必ず「代入出来る」変数名を指定してるはずだ
  2234.  
  2235.     move.w    d2,-(sp)
  2236.     movem.l    d1/a2/a3,-(sp)
  2237.     bsr    hash
  2238.     tst.w    d4
  2239.     blt    hennahikisu
  2240.  *        d4.l = * (hash.w)(文字数-1)
  2241.  *         a2.l = 元の対象の開始アドレス
  2242.     bsr    variable_check
  2243.     movem.l    (sp)+,d1/a2/a3
  2244.  * 重なってない        d2.l    = -1
  2245.  * int の n 番と一致    d2.l    = n+0000    ( n < システム変数 )
  2246.  * str の n 番と一致    d2.l    = n+0100    ( n < システム変数 )
  2247.  * char の n 番と一致    d2.l    = n+0200
  2248.  * float の n 番と一致    d2.l    = n+8000
  2249.  * d2.l < 0 = 代入出来ない(当たりがない or system 変数)
  2250.  * d0 =   0 : 普通の変数
  2251.  *      1 : 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  2252.  *    $80 : auto 変数
  2253.  *    $81 : auto 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  2254.  *     -1 : 当たりなし
  2255.     tst.l    d2
  2256.     bmi    hennahikisu
  2257.     btst    #0,d0
  2258.     bne    hennahikisu
  2259.     move.b    d0,d3
  2260.  
  2261.     move.w    (sp)+,d0        * 引き数の型
  2262.     bsr    引き数型check
  2263.  
  2264.     move.b    #$60,d2        * ポインタの引き数
  2265.     tst.b    d3
  2266.     bpl    @f
  2267.     addq.b    #1,d2        * auto 変数のポインタの引き数
  2268. @@:
  2269.     ror.w    #8,d2
  2270.     swap    d2        * 下位=変数番号
  2271.     move.l    d2,(a3)+
  2272.     addq.w    #4,d1
  2273.     bra    fnc_loop
  2274.  
  2275.  
  2276.  
  2277.  
  2278.  
  2279.  
  2280.  
  2281.  
  2282. fnc_loop_end:
  2283.     cmpi.b    #')',d0
  2284.     bne    fnc_err
  2285.     addq.l    #1,a5
  2286.  
  2287.     move.w    (sp)+,(a3)+    *  0 から始まる関数番号
  2288.  
  2289.     move.l    d1,d0
  2290.     movem.l    (sp)+,d4-d6
  2291.     rts
  2292.  
  2293.  
  2294.  
  2295.  
  2296.  * X-BASIC format の型指定と、ぺけBのが一致するかどうか
  2297. 引き数型check:
  2298.     btst    #0,d0
  2299.     beq    @f
  2300.     cmpi.w    #$8000,d2
  2301.     beq    arg_check_ok
  2302. @@:
  2303.     btst    #1,d0
  2304.     beq    @f
  2305.     tst.w    d2
  2306.     beq    arg_check_ok
  2307. @@:
  2308.     btst    #2,d0
  2309.     beq    @f
  2310.     cmpi.w    #$0200,d2
  2311.     beq    arg_check_ok
  2312. @@:
  2313.     btst    #3,d0
  2314.     beq    @f
  2315.     cmpi.w    #$0100,d2
  2316.     beq    arg_check_ok
  2317. @@:
  2318. hennahikisu:
  2319.     ERROR    18
  2320.  
  2321. arg_check_ok:
  2322.     rts
  2323.  
  2324. dim_soeji:
  2325.     ERROR    74
  2326. dim_jigen:
  2327.     ERROR    75
  2328. fnc_err:
  2329.     ERROR    16
  2330. 型違い:
  2331.     ERROR    31
  2332.  
  2333.  
  2334.  
  2335.  
  2336.  
  2337.  
  2338.     .end
  2339.  
  2340.